<?php

namespace Rebecca\RebeccaBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;

include_once('bundles/RebeccaBundle/Plugins/MPDF54/mpdf.php');

/**
 * Liquidaciones controller.
 *
 */
class LiquidacionesController extends Controller {

    public function indexAction() {

        /* @var $component Rebecca\RebeccaBundle\Component\LiquidacionesComponent */
        $component = $this->get("components.Liquidaciones");

        $entities = $component->getAll();

        return $this->render('RebeccaBundle:Liquidaciones:index.html.twig', array(
                    'entities' => $entities,
                ));
    }

    public function detailsAction($idLiquidacion, $_format) {

        /* @var $component Rebecca\RebeccaBundle\Component\LiquidacionesComponent */
        $component = $this->get("components.Liquidaciones");

        if ($_format == 'pdf') {
            $response = new Response();
            $response->headers->set('Content-Type', 'text/pdf');
            $response->send();

            $entity = $component->getLiquidacionById($idLiquidacion);

            $mpdf = new \mPDF('c', 'A4', '', '', 32, 25, 63, 25, 16, 13);

            $mpdf->SetDisplayMode('fullpage');
            $mpdf->list_indent_first_level = 0;

            $stylesheet = file_get_contents('bundles/RebeccaBundle/css/reports.css');
            $mpdf->WriteHTML($stylesheet, 1);
            $mpdf->SetHTMLHeader($this->renderView('RebeccaBundle:ReportsFormat:volante.header.html.twig', array('entity' => $entity)));
            $mpdf->AddPage('L');
            $mpdf->WriteHTML($this->renderView('RebeccaBundle:ReportsFormat:volante.html.twig', array('entity' => $entity)), 2);
            $mpdf->setFooter('{PAGENO} de 1 paginas||{PAGENO} de 1 paginas');
            $content = $mpdf->Output();

            return $response;
        } else {
            $conceptosLiquidados = $component->getConceptosLiquidados($idLiquidacion);

            $asignacion = 0;
            $deduccion = 0;

            foreach ($conceptosLiquidados as $concepto) {
                if ($concepto->getIdConcepto()->getIdTipoConcepto()->getId() == 2) {
                    $deduccion = $deduccion + abs($concepto->getValor());
                } else {
                    $asignacion = $asignacion + $concepto->getValor();
                }
            }

            $deduccion = $deduccion * -1;

            /* @var $entity \Rebecca\RebeccaBundle\Entity\Liquidaciones */
            $entity = $component->get($idLiquidacion);

            return $this->render('RebeccaBundle:Liquidaciones:details.html.twig', array(
                        'conceptosLiquidados' => $conceptosLiquidados,
                        'deduccion' => $deduccion,
                        'asignacion' => $asignacion,
                        'entity' => $entity,
                    ));
        }
    }

    public function liquidacionParcialAction() {
        /* @var $component Rebecca\RebeccaBundle\Component\LiquidacionesComponent */
        $component = $this->get("components.Liquidaciones");

        $tiposNomina = $component->getFullTiposNomina();
        $conceptos = $component->getConceptos();
        $periodosLaborales = $component->getPeriodosLaborales();

        $request = $this->getRequest();

        $hayTipoNomina = false;
        $hayLiquidaciones = false;
        $tipoNominaActual = null;
        $contratos = null;
        $idTipoNomina = $request->get("idTipoNomina");
        $repetido = $request->get("repetido");

        if (isset($repetido)) {
            $hayLiquidaciones = true;
        }

        if (isset($idTipoNomina)) {
            $hayTipoNomina = true;
            $tipoNominaActual = $component->getTipoNomina($idTipoNomina);
            $contratos = $component->getContratos($idTipoNomina);
        }

        return $this->render('RebeccaBundle:Liquidaciones:liquidacionparcial.html.twig', array(
                    'tiposNomina' => $tiposNomina,
                    'periodosLaborales' => $periodosLaborales,
                    'tipoNominaActual' => $tipoNominaActual,
                    'hayTipoNomina' => $hayTipoNomina,
                    'hayLiquidaciones' => $hayLiquidaciones,
                    'contratos' => $contratos,
                    'conceptos' => $conceptos,
                ));
    }

    public function liquidacionTotalAction() {
        /* @var $component Rebecca\RebeccaBundle\Component\LiquidacionesComponent */
        $component = $this->get("components.Liquidaciones");

        $tiposNomina = $component->getFullTiposNomina();

        $request = $this->getRequest();

        $periodosLaborales = null;
        $hayTipoNomina = false;
        $tipoNominaActual = null;
        $idTipoNomina = $request->get("idTipoNomina");

        if (isset($idTipoNomina)) {
            $hayTipoNomina = true;
            $tipoNominaActual = $component->getTipoNomina($idTipoNomina);
            $periodosLaborales = $component->getPeriodosLaboralesByTipoNomina($idTipoNomina);
        }

        return $this->render('RebeccaBundle:Liquidaciones:liquidaciontotal.html.twig', array(
                    'tiposNomina' => $tiposNomina,
                    'periodosLaborales' => $periodosLaborales,
                    'tipoNominaActual' => $tipoNominaActual,
                    'hayTipoNomina' => $hayTipoNomina,
                ));
    }

    public function confirmarLiquidacionAction() {
        /* @var $component Rebecca\RebeccaBundle\Component\LiquidacionesComponent */
        $component = $this->get("components.Liquidaciones");

        $request = $this->getRequest();

        $allContratos = $request->get('AllContratos');
        $allConceptos = $request->get('AllConceptos');
        $idTipoNomina = $request->get('tipoNomina');
        $idPeriodoLaboral = $request->get('periodoLaboral');
        $fechaLiquidacion = $request->get('fechaLiquidacion');
        $notas = $request->get('notas');
        $contratos = array();
        $conceptos = array();

        if (isset($allContratos)) {
            foreach ($component->getContratos($idTipoNomina) as $contrato) {
                array_push($contratos, $contrato->getId());
            }
        } else {
            $contratos = $request->get('contratos');
        }

        if (isset($allConceptos)) {
            foreach ($component->getConceptos() as $concepto) {
                array_push($conceptos, $concepto->getId());
            }
        } else {
            $conceptos = $request->get('conceptos');
        }

        $repetido = false;
        $liquidacionesRepetidas = array();
        $conceptosLiquidados = $component->getAllConceptosLiquidados();

        if (isset($conceptosLiquidados)) {
            foreach ($conceptosLiquidados as $conceptoLiquidado) {
                /* @var $conceptoLiquidado \Rebecca\RebeccaBundle\Entity\ConceptosLiquidados */
                $posibleConcepto = $conceptoLiquidado->getIdConcepto()->getId();
                $posibleContrato = $conceptoLiquidado->getIdLiquidacion()->getIdContrato()->getId();
                $posiblePeriodo = $conceptoLiquidado->getIdLiquidacion()->getIdPeriodoLaboral()->getId();
                foreach ($conceptos as $concepto) {
                    foreach ($contratos as $contrato) {
                        if ($posibleConcepto == $concepto && $posibleContrato == $contrato && $posiblePeriodo == $idPeriodoLaboral) {
                            $repetido = true;
                            array_push($liquidacionesRepetidas, $conceptoLiquidado);
                        }
                    }
                }
            }
        }

        if ($repetido == false) {

            $liquidaciones = $component->generateLiquidaciones($contratos, $fechaLiquidacion, $idPeriodoLaboral, $notas, $conceptos);

            return $this->render('RebeccaBundle:Liquidaciones:confirmarliquidacion.html.twig', array(
                        'liquidaciones' => $liquidaciones,
                        'contratos' => $contratos,
                        'conceptos' => $conceptos,
                    ));
        } else {
            return $this->redirect($this->generateUrl('liquidaciones_liquidar', array(
                                'repetido' => $repetido
                            )));
        }
    }

    public function confirmarLiquidacionTotalAction() {
        /* @var $component Rebecca\RebeccaBundle\Component\LiquidacionesComponent */
        $component = $this->get("components.Liquidaciones");

        $request = $this->getRequest();
        $idPeriodoLaboral = $request->get('periodoLaboral');
        $fechaLiquidacion = $request->get('fechaLiquidacion');
        $notas = $request->get('notas');

        $periodoLiquidado = $component->verificarPeriodo($idPeriodoLaboral);
        $liquidaciones = null;

        if (!$periodoLiquidado) {
            $liquidaciones = $component->generateAllLiquidaciones($fechaLiquidacion, $idPeriodoLaboral, $notas);
        }

        return $this->render('RebeccaBundle:Liquidaciones:confirmarliquidacion.html.twig', array(
                    'liquidaciones' => $liquidaciones,
                    'periodoLiquidado' => $periodoLiquidado,
                ));
    }

    public function guardarAction() {

        /* @var $component Rebecca\RebeccaBundle\Component\LiquidacionesComponent */
        $component = $this->get("components.Liquidaciones");

        $request = $this->getRequest();

        $idPeriodoLaboral = $request->get('periodoLaboral');
        $fechaLiquidacion = $request->get('fechaLiquidacion');
        $notas = $request->get('notas');

        $liquidaciones = $component->generateAllLiquidaciones($fechaLiquidacion, $idPeriodoLaboral, $notas, true);

        $component->deepSave($liquidaciones);

        return $this->indexAction();
    }

    public function getReportAction() {
        
        /* @var $component Rebecca\RebeccaBundle\Component\LiquidacionesComponent */
        $component = $this->get("components.Liquidaciones");
        
        $periodos = $component->getPeriodosLiquidados();
        
        return $this->render('RebeccaBundle:Liquidaciones:getreport.html.twig', array(
            "periodos" => $periodos,
        ));
    }
    
    

    public function downloadReportAction() {
        /* @var $component Rebecca\RebeccaBundle\Component\LiquidacionesComponent */
        $component = $this->get("components.Liquidaciones");
        
        $documentoIdentidad = $this->getRequest()->get("documentoIdentidad");
        $idPeriodo = $this->getRequest()->get("idPeriodo");
        
        $entity = $component->getLiquidacionByIdentificacion($documentoIdentidad, $idPeriodo);
        
        if(!is_null($entity)){
            $response = new Response();
            $response->headers->set('Content-Type', 'text/pdf');
            $response->send();

            $mpdf = new \mPDF('c', 'A4', '', '', 32, 25, 63, 25, 16, 13);

            $mpdf->SetDisplayMode('fullpage');
            $mpdf->list_indent_first_level = 0;

            $stylesheet = file_get_contents('bundles/RebeccaBundle/css/reports.css');
            $mpdf->WriteHTML($stylesheet, 1);
            $mpdf->SetHTMLHeader($this->renderView('RebeccaBundle:ReportsFormat:volante.header.html.twig', array('entity' => $entity)));
            $mpdf->AddPage('L');
            $mpdf->WriteHTML($this->renderView('RebeccaBundle:ReportsFormat:volante.html.twig', array('entity' => $entity)), 2);
            $mpdf->setFooter('{PAGENO} de 1 paginas||{PAGENO} de 1 paginas');
            $content = $mpdf->Output();
            
            return $response;
        }
        
        return $this->redirect($this->generateUrl('liquidaciones_getreport'));
    }

    public function contratosPorCedulaAction() {
        $request = $this->getRequest();

        $cedula = $request->get("numeroIdentidad");
        if (is_string($cedula)) {
            /* @var $component \Rebecca\RebeccaBundle\Component\TrabajadoresComponent */
            $component = $this->get("components.Trabajadores");

            $trabajador = $component->findByCedula($cedula);
            $periodos = $this->get("components.PeriodosLaborales")->getAll();

            return $this->render('RebeccaBundle:Liquidaciones:contratosPorCedula.html.twig', array(
                        "trabajador" => $trabajador,
                        "contratos" => $trabajador->getContratos(),
                        "periodos" => $periodos,
                    ));
        } else {
            return $this->pedirCedulaAction();
        }
    }

    public function descargarLiquidacion() {
        $request = $this->getRequest();

        $contrato = $request->get("contrato");
        $periodo = $request->get("periodo");

        if (is_string($contrato) && is_string($periodo)) {
            /* @var $component \Rebecca\RebeccaBundle\Component\LiquidacionesComponent */
            $component = $this->get("components.Liquidaciones");

            $liquidacion = $component->getLiquidacionByPeriodoAndContrato($periodo, $contrato);
            $this->detailsAction($liquidacion->getId());
        } else {
            return $this->pedirCedulaAction();
        }
    }

}
